<?php

namespace App\Libs;

trait GetTableDataLuRuTrait
{
    //当datatable控件没启用排序时，可传入$orderby参数指定默认排序
    //当datatable控件启用排序时，$orderby参数传 null
    public function getTableData2($para, $with, $orderby, $whereIn)
    {
//        $draw = $para['draw'];
//        dd($draw);
//        $search = $para['search']['value'];
        $order = isset($para['order']) ? $para['order'] : null;
        // $orderBy = ['telephone','asc'];
        $this_orWhere_orderBy = $this;

        if (isset($whereIn)) {
            // $recordsTotal = $this->where($where[0], $where[1], $where[2])->count(); //------------sql 执行
            $recordsTotal = $this->whereIn('id', $whereIn)->count(); //------------sql 执行
        } else {
            $recordsTotal = $this->count(); //------------sql 执行
        }

//        $para_col = $para['columns'];
//        if (strlen($search) > 0) {
//            //判断是否有搜索条件
//            //以下匿名函数实现的功能，laravel手册中叫参数分组
//            $this_orWhere_orderBy = $this_orWhere_orderBy->where(function ($query) use ($search, $para_col) {
//                foreach ($para_col as $val) {
//                    if ($val['searchable'] === 'true') {
//                        $query->orWhere($val['data'], 'like', '%' . $this->escape_like_str2($search) . '%');
//                    }
//                }
//            });
//        }

        if (isset($whereIn)) {
            $this_orWhere_orderBy = $this_orWhere_orderBy->whereIn('id', $whereIn);
        }

//        $recordsFiltered = strlen($search) > 0  ? $this_orWhere_orderBy->count() : $recordsTotal; //------------sql 执行

        if (isset($order)) {
            //判断是否启用排序
            foreach ($order as $val) {
                $this_orWhere_orderBy = $this_orWhere_orderBy->orderBy($para['columns'][intval($val['column'])]['data'], $val['dir']);
            }
        } else if (isset($orderby)) {
            //判断是否指定了第三个参数
            $this_orWhere_orderBy = $this_orWhere_orderBy->orderBy($orderby[0], $orderby[1]);
        }

        if ($with) {
            # code...
//            $data = $this_orWhere_orderBy->offset($para['start'])->limit($para['length'])->with($with)->get(); //------------sql 执行
            $data = $this_orWhere_orderBy->with($with)->get(); //------------sql 执行
        } else {
            # code...
//            $data = $this_orWhere_orderBy->offset($para['start'])->limit($para['length'])->get(); //------------sql 执行
            $data = $this_orWhere_orderBy->get(); //------------sql 执行
        }

        $result = [
//            "draw" => intval($draw),
            "recordsTotal" => intval($recordsTotal),
//            "recordsFiltered" => intval($recordsFiltered),
            "data" => $data,
        ];
        return $result;
    }
    //datatable控件只把 单引号 进行了转义，“ \ _ % ” 需要自己去转义
    private function escape_like_str2($str)
    {
        $like_escape_char = "\\";
        $appear_count = substr_count($str, $like_escape_char);
        // dd(str_repeat($like_escape_char, $appear_count));
        return str_replace(
            [
                str_repeat($like_escape_char, $appear_count),
                '%',
                '_'
            ],
            [
                str_repeat($like_escape_char, $appear_count * 2 + 1),
                $like_escape_char . '%',
                $like_escape_char . '_',
            ],
            $str
        );
    }
}
